home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / graphics / degas2ps.arc / DEGAS2PS.C01 < prev    next >
Text File  |  1989-06-20  |  32KB  |  1,072 lines

  1. /*******************************************************************/
  2. /*                                                                                                                                */
  3. /*         DEGAS2PS.PRG                                                                                                 */
  4. /* Programme d'impression d'images provenant de DEGAS (.PI3).      */
  5. /* La sortie se fait en PostScript vers un fichier ou une laser.   */
  6. /* Il est possible de sélectionner une partie de l'image,                  */
  7. /* la réduction ou l'augmentation ainsi que la position sur                 */
  8. /* la page.                                                                                                                */
  9. /* IRISA de RENNES                                                                                                    */
  10. /*                                                                                                                               */
  11. /* Matériels : ATARI 1040 STFM + LaserWriter II NT                               */
  12. /* Langage : Megamax C                                                                                       */
  13. /*                                                                                                                               */
  14. /* ecrit par :     Bertrand DECOUTY (IRISA-INRIA, Rennes)                         */
  15. /*                            Philippe LE THOMAS (stage IUT Lannion 1988)                 */
  16. /*                                                                                                                                 */
  17. /*******************************************************************/
  18. char version[]= "DEGAS2PS 1.52";
  19.  
  20. /* 1= francais, 0= anglais */
  21. #define FRANCAIS 0
  22.  
  23. #include <stdio.h>
  24. #include <osbind.h>
  25. #include <gembind.h>
  26. #include <gemdefs.h>
  27. #include <obdefs.h>
  28. #include <string.h>
  29. #include "DEGAS2PS.H"
  30. #define RESSOURCE "DEGAS2PS.RSC"
  31.  
  32. #if FRANCAIS
  33. #define MESS0 "[3][ | Le fichier ressource | est introuvable... ][ STOP ]"
  34. #define MESS1 "[2][ | Le périphérique n'est | pas connecté... ][ OK | ANNULER ]"
  35. #define MESS2 "[3][ | Erreur lors de l'ouverture | du fichier de sortie... ][ STOP ]"
  36. #define MESS3 "[2][ | Voulez-vous réellement | stopper l'impression ? ][ NON | OUI ]"
  37. #define MESS4 "[3][ Erreur d'écriture | du fichier PostScript ...| disque plein ? ][ STOP ]"
  38. #define MESS5 "[3][ | Erreur lors de l'ouverture | du fichier image... ][ STOP ]"
  39.  
  40. #else         /* messages en anglais */
  41. #define MESS0 "[3][ | Resource file | not found... ][ STOP ]"
  42. #define MESS1 "[2][ | Peripheral device | not connected or off-line... ][ OK | CANCEL ]"
  43. #define MESS2 "[3][ | I can't open | output file... ][ STOP ]"
  44. #define MESS3 "[2][ | Do you really want | to stop printing ? ][ NO | YES ]"
  45. #define MESS4 "[3][ I/O ERROR while | writing PostScript file | disk full ?][ Sorry.. ]"
  46. #define MESS5 "[3][ | I can't open | image file... ][ STOP ]"
  47. #endif
  48.  
  49. #define void /**/
  50. #define VRAI 1
  51. #define FAUX 0
  52. #define RESW 639                                                            /* Largeur maximale de l'écran */
  53. #define RESH 399                                                            /* Hauteur maximale de l'écran */
  54. #define Souris_Croix graf_mouse(5,&dummy)
  55. #define Souris_Normale graf_mouse(0,&dummy)
  56. #define Cache_Souris graf_mouse(256,&dummy)
  57. #define Montre_Souris graf_mouse(257,&dummy)
  58.  
  59. /* structure pour informations sur fichier */
  60. /*
  61. typedef struct {
  62.     long b_free;
  63.     long b_total;
  64.     long b_secsiz;
  65.     long b_clsiz;
  66. } disk_info;
  67. */
  68.  
  69. /* variables utilisées par le GEM */
  70.  
  71. int work_in[12],work_out[57],contrl[12],intin[256],intout[256],
  72.     ptsin[128],ptsout[128];
  73.  
  74. /* variables globales */
  75.  
  76. int periph; /* indique le peripherique de sortie : 0 = centronics (PRT:) */
  77.                         /*                                                                         1 = RS 232     (AUX:) */
  78.                         /*                                                                         2 = fichier (file.PS) */
  79. int    handle,x,y,w,h,xres,yres,nombre,sortie,
  80.     xsouris,ysouris,etatbout,etatclav,codeclav,nbpress,event,
  81.     xdial,ydial,wdial,hdial,test,mgbuf[11],debut,lon,
  82.     xstart,ystart,width,height,xso,yso,swo,sho,ouvert,
  83.     rx,ry,rw,rh,dummy,boxw,boxh,deja,sw,sh,suppl,
  84.     w_handle,wx,wy,wh,ww,lecture,ecriture,
  85.     dfbb[10],dfbs[10],frmary[8],clpry[4],fin;
  86. long buffer,ecran;
  87. char source[80],tex[4][80],mode[80],cheminlecture[80],
  88.          cheminecriture[80],nomfenetre[50],nomsortie[30];
  89. OBJECT *barre,*dial;
  90. /**************************************************************************/
  91. /* initialisation des tableaux contenant les coordonnées des     */
  92. /* blocs pour le clipping                                                                         */
  93.  
  94. void init()
  95.  
  96. {        
  97.     xres = work_out[0]+1;
  98.     yres = work_out[1]+1;
  99.     vq_extnd(handle,1,work_out);
  100.     dfbb[0]=(ecran+34)>>16;
  101.     dfbb[1]=(ecran+34)&0xffff;
  102.     dfbb[2]=xres;
  103.     dfbb[3]=yres;
  104.     dfbb[4]=xres>>4;
  105.     dfbb[5]=0;
  106.     dfbb[6]=work_out[4];
  107.     dfbs[0]=dfbs[1]=0;
  108.     ouvert = lecture = ecriture = FAUX;
  109. /* lecture des coordonnées maximales de la fenetre */
  110.     wind_get(0,WF_WORKXYWH,&wx,&wy,&ww,&wh);
  111.     buffer = Malloc((long)32000+256+256);
  112.     w_handle = wind_create(NAME,wx,wy,ww,wh);
  113. }
  114. /**************************************************************************/
  115. void main()
  116.  
  117. {
  118.     int i;
  119.     register int boucle;
  120.     
  121. /* Initialisation des variables utilisées par le système */
  122.     for (boucle=1; boucle<10; work_in[boucle++]=1);
  123.     work_in[10]=2;
  124.     appl_init();
  125.     Cache_Souris;
  126. /* ouverture de la station de travail virtuelle */
  127.     handle = graf_handle(&i,&i,&i,&i);
  128.     v_opnvwk(work_in,&handle,work_out);
  129.     init();                            
  130.     Montre_Souris;
  131. /* chargement du fichier ressource contenant le menu, */
  132. /* les boites de dialogue et les différentes icones */
  133.     if (!rsrc_load(RESSOURCE))
  134.     {
  135.         form_alert(1,MESS0);
  136.     }
  137.     else
  138.     {
  139. /* affichage du menu et lecture de son adresse dans l'arbre    */            
  140.         Souris_Normale;
  141.         rsrc_gaddr(R_TREE,MENU,&barre);
  142.         edition();
  143.     }                                                
  144.     quitter();
  145. }
  146. /**************************************************************************/
  147. /* fermeture de la station, de le fenetre et liberation de la    */
  148. /* memoire                                                                                                         */
  149. void quitter()
  150.  
  151. {
  152.     menu_bar(barre,FAUX);
  153. /* on libère la mémoire occupée par l'image */
  154.     Mfree(buffer);
  155.     if (ouvert) 
  156.     {
  157. /* effacement de la fenetre */
  158.         wind_close(w_handle);
  159.         wind_delete(w_handle);
  160.     }
  161.     v_clsvwk(handle);
  162.     Souris_Normale;
  163.     Montre_Souris;
  164.     appl_exit();
  165. }
  166. /**************************************************************************/
  167. /* routine de copie de bloc                                                             */
  168. /* drap : 1 = copie sans changement, 0 = inversion video */
  169. void image(sx,sy,dx,dy,l,h,drap)
  170.  
  171. register int sx,sy,dx,dy,l,h,drap;
  172. {
  173.     frmary[0]=sx;        
  174.     frmary[1]=sy;            
  175.     frmary[2]=sx+l-1;    
  176.     frmary[3]=sy+h-1;        
  177.     frmary[4]=dx;        
  178.     frmary[5]=dy;        
  179.     frmary[6]=dx+l-1;    
  180.     frmary[7]=dy+h-1;
  181.     clpry[0]=dx;
  182.     clpry[1]=dy;
  183.     clpry[2]=dx+l-1;
  184.     clpry[3]=dy+h-1;
  185.     vs_clip(handle,1,clpry);
  186.     Cache_Souris;
  187.     if (drap) 
  188.         vro_cpyfm(handle,3,frmary,dfbb,dfbs);
  189.     else 
  190.         vro_cpyfm(handle,12,frmary,dfbb,dfbs);
  191.     Montre_Souris;
  192. }
  193. /**************************************************************************/
  194. /* attend un appui sur le bouton gauche pour renvoyer les coordonnées */
  195. /* de la souris, si bouton droit => on quitte. Un appui sur ALTERNATE */
  196. /* réinitialise l'ecran                                                                                             */
  197. void gestion()
  198.  
  199. {
  200.     int bouton,key;
  201.  
  202.     Souris_Croix;
  203.     undo();
  204.     do
  205.     {
  206.         event = evnt_mouse(0,0,0,RESW,RESH,&xsouris,&ysouris,&bouton,&key);
  207. /* test le bouton gauche */
  208.         if (bouton & 0x0001) souris();
  209. /* test la touche ALT */
  210.         if (key & 0x0008) undo();
  211.     }    
  212. /* test le bouton droit */
  213.     while (!(bouton & 0x0002));
  214.     Souris_Normale;
  215. }
  216. /**************************************************************************/
  217. /* restitution de l'écran original */
  218. void undo()
  219.  
  220. {
  221.     deja = FAUX;
  222.     sho = 400; swo = 640;
  223.     image(0,0,0,0,RESW+1,RESH+1,VRAI);
  224. }
  225. /**************************************************************************/
  226. /* affichage d'un rectangle de sélection pour indiquer la zone */
  227. /* que l'on désire imprimer                                                                            */
  228. void souris()
  229.  
  230. {
  231.     int status,x,y,xx,yy,xd,yd;
  232.     char message[80],texte[50];
  233.     
  234.     undo();
  235.     deja = VRAI;
  236.     xx = x = 0; yy = y = 0;
  237.     xd = xsouris;
  238.     yd = ysouris;
  239.     Cconout(0x07);
  240.     do
  241.     {
  242.         vq_mouse(handle,&status,&x,&y);
  243.         if ((xx != x) || (yy != y)) 
  244.         {
  245.             image(xd,yd,xd,yd,xx-xd+1,yy-yd+1,VRAI);
  246.             image(xd,yd,xd,yd,x-xd+1,y-yd+1,FAUX);
  247.             xx = x; yy = y;
  248.         }
  249.     }
  250.     while ((status & 0x0001));
  251. /*    form_alert(1,MESS6);*/
  252.     Souris_Croix;
  253.     if (xd <= x) { xso = xd;swo = x - xso; }
  254.     else { xso = x;swo = xd - xso; }
  255.     if (yd <= y) { yso = yd;sho = y - yso; }
  256.     else { yso = y;sho = yd - yso; }
  257. }
  258. /**************************************************************************/
  259. /* gestion des évènements : menu, raffraichissement écran */
  260. void edition()
  261.  
  262. {
  263.     int xstart,ystart,wstart,hstart,rx,ry,rh,rw;
  264.     
  265.     Souris_Normale;
  266.     menu_ienable(barre,IMPRIMER,FAUX);
  267.     menu_ienable(barre,EDITER,FAUX);
  268.     menu_bar(barre,VRAI);
  269.     while (fin != 1)
  270.     {
  271.         event = evnt_mesag(mgbuf);
  272.         wind_update(VRAI);
  273.         switch (mgbuf[0])
  274.         {
  275. /* un menu a ete selectionne */
  276.             case MN_SELECTED : selection();
  277.                 break;
  278. /* rafraichissement de la fenetre */
  279.             case WM_REDRAW :
  280.                 wind_get(mgbuf[3],WF_WORKXYWH,&xsta